/**
 * 认证中间件
 * 验证请求中的JWT令牌并设置用户信息
 */
const jwt = require('jsonwebtoken');
const logger = require('../utils/logger');

const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

/**
 * 验证JWT令牌中间件
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件函数
 */
const authenticate = (req, res, next) => {
  // 从请求头获取令牌
  const authHeader = req.headers.authorization;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ message: '未提供访问令牌' });
  }

  const token = authHeader.split(' ')[1];

  try {
    // 验证令牌
    const decoded = jwt.verify(token, JWT_SECRET);
    
    // 将用户信息添加到请求对象
    req.user = {
      id: decoded.id,
      username: decoded.username
    };
    
    next();
  } catch (error) {
    logger.error(`认证错误: ${error.message}`);
    
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({ message: '会话已过期，请重新登录' });
    }
    
    return res.status(401).json({ message: '无效的访问令牌' });
  }
};

module.exports = authenticate; 